feat: distribute complypack as multi-platform plugin with container MCP server#31
feat: distribute complypack as multi-platform plugin with container MCP server#31jpower432 wants to merge 13 commits into
Conversation
|
@beatrizmcouto Pretty much done with any clean up items. This is the first PR where I think review is really important. Will clean it up and see who I can tag. |
38a989b to
5518373
Compare
Add repeatable --source and --schema flags to the mcp serve command, allowing direct configuration without a YAML file. When --source flags are present, a ComplyPackConfig is built from flag values; otherwise the existing --config file path is used. - parseSourceFlags: handles oci:// (TLS) and oci+http:// (plain HTTP) - parseSchemaFlags: handles bare platform names and platform=source syntax - Refactor NewServer to accept ServerOptions.Config directly Assisted-by: Claude (Anthropic, Claude Opus 4.6) Signed-off-by: Jennifer Power <[email protected]>
Remove hardcoded version "1.0" from buildConfigFromFlags in mcp.go since the MCP server does not use the version field (it's only needed for pack/scan commands). Add comprehensive test for buildConfigFromFlags to verify complete flag-to-config transformation including source parsing, schema parsing, and proper struct field population. Assisted-by: Claude (Anthropic, Claude Opus 4.6) Signed-off-by: Jennifer Power <[email protected]>
Multi-stage build with UBI 9 micro base image. Produces a minimal container for MCP server distribution via GHCR. Refs: complytime#24 ADR: docs/adr/012-container-mcp-distribution.md Assisted-by: Claude (Anthropic, Claude Opus 4.6) Signed-off-by: Jennifer Power <[email protected]>
Uses org-infra reusable workflows for GHCR publish with SLSA provenance, SBOM attestations, and Sigstore signing. Multi-arch (amd64/arm64) build on version tags and main pushes. Refs: complytime#24 Assisted-by: Claude (Anthropic, Claude Opus 4.6) Signed-off-by: Jennifer Power <[email protected]>
Claude Code, Cursor, and Gemini CLI manifests following the superpowers multi-manifest pattern. Updates .mcp.json to reference the container image. Restructures skill directory layout. Removes openpackage.yml and legacy install docs. Refs: complytime#24 Assisted-by: Claude (Anthropic, Claude Opus 4.6) Signed-off-by: Jennifer Power <[email protected]>
Covers Claude Code, OpenCode, flag syntax, config file fallback, and image verification. Refs: complytime#24 Assisted-by: Claude (Anthropic, Claude Opus 4.6) Signed-off-by: Jennifer Power <[email protected]>
Copy CA certificates into the UBI micro container so the CUE registry (registry.cue.works) is reachable over TLS. Assisted-by: Claude (Anthropic, Claude Opus 4.6) Signed-off-by: Jennifer Power <[email protected]>
5518373 to
2378fea
Compare
Pin reusable workflow references to SHA and pin ubi9-micro to a versioned digest to satisfy zizmor and hadolint. Assisted-by: Claude (Anthropic, Claude Opus 4.6) Signed-off-by: Jennifer Power <[email protected]>
Signed-off-by: Jennifer Power <[email protected]> Co-authored-by: Jennifer Power <[email protected]>
Signed-off-by: Jennifer Power <[email protected]>
Previously, passing only --schema without --source fell through to config file loading and failed. Now either flag triggers the flags-based config path. Assisted-by: Claude (Anthropic, Claude Opus 4.6) Signed-off-by: Jennifer Power <[email protected]>
Prevents auto-loading a broken config with placeholder values and :latest tag. Users copy and fill in their own registry, source, and pinned version. Assisted-by: Claude (Anthropic, Claude Opus 4.6) Signed-off-by: Jennifer Power <[email protected]>
|
@jpower432 Started taking a look. I'll finish up my review first thing Monday. |
trevor-vaughan
left a comment
There was a problem hiding this comment.
I would suggest running megalinter against the changes.
If you want a light(ish) way to do it locally, I have a project at https://github.com/trevor-vaughan/megalint-config.
- Fix allowed_identity_regex to match org-infra reusable workflow origin - Add Trivy image scan stage between build and sign - Gate signing on scan success via verify_vuln - Run container as non-root user (ARG USER_UID=10001) Assisted-by: Claude (Anthropic, Claude Opus 4.6) Signed-off-by: Jennifer Power <[email protected]>
Thanks @trevor-vaughan. It is running in CI under CI/Standardized CI/Run linters. Are you suggesting a change in that config? |
hbraswelrh
left a comment
There was a problem hiding this comment.
@jpower432 LGTM. One thing I noticed is the incremental editing of the .mcp.json after each task. This requires re-connecting to the complypack mcp server every time. I tried a couple different tests where I intentionally had incorrect mapping-references and it failed to restart the mcp server. I think this is a great move to enforce "correctness" from the start. I like the gitleaks feature, too.
Summary
--sourceand--schemarepeatable CLI flags tomcp serveso the MCP server can be fully configured without a YAML file (ADR 013)cue://module@v0#Definitionsyntax)ValidateForMCPto not require pack/scan-only fieldsFlags syntax
Container invocation
{ "mcpServers": { "complypack": { "command": "docker", "args": ["run", "--rm", "-i", "ghcr.io/complytime/complypack:latest", "mcp", "serve", "--source", "oci://registry.example.com/gemara/controls:v1", "--schema", "ci"] } } }Dependencies
feat/multi-source-gemara(includes multi-source Gemara + GuidanceCatalog support)Test plan
go test -race ./...)podman build -f Containerfilecue://...@v0#Definitionsyntax)claude plugin validate .